19 mai 2018

Fourier transforms of a few common signals

In this presentation we describe the Fourier coefficients of a few common signals. We illustrate how irregularities (discontinuities) in the signal correspond to a slow decay of weights on larger harmonics.

This presentation was made with

  • ioslides by RStudio
  • python's numpy for fast Fourier transforms and inverses
  • python's version of plotly
  • the reticulate package for executing python in RStudio

Python includes

import json
import plotly
import plotly.graph_objs as go
import numpy as np
from numpy.fft import fft, ifft
import math
eps = 1e-3
def plot_signal_and_fft(signal, name, N=20, asFigure=False):
    f = fft(signal)
    N = min(N, len(signal) / 2)
    x = np.arange(-N, N)
    y = np.concatenate((f[-N:], f[:N]))
    f[N:len(f) - N] = 0
    signal_reconstructed = ifft(f).real
    data = [go.Scatter(x=np.arange(-len(signal), len(signal)),
                       y=np.concatenate((signal, signal)),
                       name='Discrete signal'),
            go.Scatter(x=np.arange(-len(signal), len(signal)),
                       y=np.concatenate(
                           (signal_reconstructed, signal_reconstructed)),
                       name='Signal reconstructed from truncated FFT'),
            go.Bar(x=x, y=y.real,
                   name='Fourier transform (real part)',
                   xaxis='x2', yaxis='y2'),
            go.Bar(x=x, y=y.imag,
                   name='Fourier transform (imaginary part)',
                   xaxis='x2', yaxis='y2')]
    layout = go.Layout(title='Fourier transform for {}'.format(name),
                       barmode='stack',
                       xaxis=dict(domain=[0, .45]),
                       xaxis2=dict(domain=[.55, 1]),
                       yaxis=dict(title='amplitude'),
                       yaxis2=dict(anchor='x2'),
                       legend=dict(orientation='h'))
    fig = dict(data=data, layout=layout)
    return json.dumps(fig, cls=plotly.utils.PlotlyJSONEncoder)

Sinusoidal wave

The Fourier of a sinusoidal is 100% imaginary, and has positive value on the main frequency only.

x = np.arange(0, 2 * math.pi, eps)
fig = plot_signal_and_fft(np.sin(x), 'sinus')

Cosinusoidal wave

The Fourier of a cosinus is 100% real, and has positive value on the main frequency only.

fig = plot_signal_and_fft(np.cos(x), 'cos')

Triangular wave

The triangle wave has a few harmonics, but they strength decrease rather quickly. The signal reconstructed from 20 harmonics matches very well the original signal.

x = np.arange(-1, 1, eps)
y = np.abs(x) - .5
fig = plot_signal_and_fft(y, 'triangle')

Square signal

The signal is discontinuous and as such, the Fourier coefficient decrease slowly. A truncated Fourier series corresponds to a continuous signal that matches only approximately the original signal.

y = np.concatenate((np.ones(100), -np.ones(100)))
fig = plot_signal_and_fft(y, 'square')

Sawtooth signal

This signal is also discontinuous and again, the Fourier coefficient decrease slowly. A truncated Fourier series corresponds to a continuous signal that matches only approximately the original signal.

x = np.arange(0, 1, eps)
y = np.abs(x) - .5
fig = plot_signal_and_fft(y, 'sawtooth')

Two columns slide

Lorem ipsum dolor sit amet, dui sit nisi lacus class nec dis et elit eu. Commodo faucibus sed vel. In interdum velit vestibulum condimentum. Suspendisse praesent rutrum ac. Sollicitudin suscipit quam, faucibus sit ut tincidunt maecenas convallis tincidunt non vivamus morbi. Pellentesque purus sit quis ac magnis habitasse. Ante finibus eget. Gravida aliquam et viverra facilisis et, nulla aliquam eget felis enim sed tempus. Litora sed ipsum morbi fringilla sed rhoncus congue maecenas. Fusce et a placerat primis non ac tincidunt litora proin magna, aliquet lorem. Blandit elementum interdum platea sagittis magnis ornare faucibus.

Venenatis cursus amet. Finibus magna elementum molestie donec feugiat vulputate malesuada sapien justo. Porttitor consectetur himenaeos, posuere vestibulum maximus. Ut cras, eu nostra montes varius pellentesque natoque nec. Eleifend quis volutpat venenatis congue, venenatis sociis nibh sagittis magna. Lorem a auctor. Congue varius semper et eleifend montes. Hendrerit vivamus non mollis blandit, eget feugiat odio ligula suscipit est. Cras velit enim at sapien bibendum dictum lacinia luctus. Auctor, sed maecenas sed et. Efficitur laoreet cras id, imperdiet amet id fames.

Velit dis nec odio, primis risus sem volutpat quam. Laoreet dis justo mauris tristique porttitor non imperdiet elementum egestas, sem vulputate hendrerit! Lacus metus vehicula sapien dis ante id. Sed, adipiscing nullam tempus in non curabitur, ut. Ad velit orci, sed. Sed accumsan, aliquet mi enim penatibus parturient in, sed. Congue tincidunt phasellus in felis gravida turpis condimentum pharetra amet luctus et sed. Laoreet at, volutpat eget phasellus consectetur massa. Egestas non auctor. Sapien, turpis laoreet natoque elementum.

Unequal columns

Lorem ipsum dolor sit amet, vel fermentum convallis sit lacus vitae dui morbi. Vel et est eleifend consequat, tortor morbi cum sed eros. Porta sapien et sed, aliquam, lacus mollis molestie posuere porttitor id ut sed feugiat! Id at est donec neque molestie ante. Morbi consectetur leo non. Integer aenean sed, tristique eleifend pretium dictum luctus. Eu quam nisl ac. Aenean facilisis, amet pharetra commodo quam ut placerat commodo ac vel! Mus, elementum. Et, dis ridiculus sed sem aliquam purus vivamus dolor. Eget habitasse blandit vivamus donec quis nec sit condimentum sociis eu. Sed, sed ac? Lacus dis, ultrices mus tincidunt, aliquam.

Lorem ipsum dolor sit amet, dictumst consectetur sit ante erat, metus ullamcorper. Vestibulum orci, quam nunc phasellus class nunc proin purus. Ex fringilla a egestas. Gravida massa posuere ad ultricies magna mus. Augue, mi id montes. Malesuada ut eget, mus sit, in donec eleifend sed. Luctus inceptos. Facilisi eu accumsan scelerisque cubilia nisi, tellus id sapien et arcu commodo sed. Iaculis felis, felis sed cursus adipiscing leo, vivamus, id. Id nibh, lacus mauris nisl eget tincidunt bibendum ullamcorper. Vel pretium pulvinar aenean ac lectus, curae sed, lectus ac. Ut potenti id imperdiet sed et nisi natoque tincidunt sociis. Amet consequat feugiat eleifend, aenean sed, semper, non mattis tortor. Faucibus quis eu aliquam congue suspendisse, porttitor feugiat in. Sociosqu risus tincidunt nibh.

Lacus in leo conubia ut iaculis adipiscing. Scelerisque amet morbi purus, potenti ante, porta convallis. Ligula commodo elit justo himenaeos cras. Auctor ipsum sapien non mattis phasellus, eu, elementum imperdiet eros, et tincidunt, in dolor. Cras elit dictumst erat nam suscipit sed eros blandit eget justo luctus. Et nam fusce luctus. Fermentum aenean, ut accumsan ligula lorem fames ante in dolor hac. Lobortis tempus. Condimentum, augue et tristique potenti, nunc condimentum. Donec metus sed facilisi eu efficitur, tempus sed in. Lacus amet ornare conubia fermentum leo. Eget morbi dapibus eu pretium nulla cras ut. Proin eleifend eros auctor, efficitur dapibus sociis urna aliquet fringilla. Sollicitudin scelerisque hac ex risus.

Sawtooth signal in two columns

This signal is also discontinuous and again, the Fourier coefficient decrease slowly. A truncated Fourier series corresponds to a continuous signal that matches only approximately the original signal.

x = np.arange(0, 1, eps)
y = np.abs(x) - .5
fig = plot_signal_and_fft(y, 'sawtooth')